﻿using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using Controllers;
using Interfaces;
using Utilities;

namespace Views.Moduler
{
    public partial class SøgComputerUdlån : Window
    {
        #region Fields

        private readonly Controller _controller;
        private readonly SøgHardware _søghardware;

        #endregion

        #region Properties

        public IEnhed Computer { get; set; }
        public IUdlån SelectedUdlån { get; set; }
        public IBruger SelectedBruger { get; set; }

        #endregion

        #region Creation

        public SøgComputerUdlån(Controller controller, IEnhed iComputer, SøgHardware søgHardware)
        {
            InitializeComponent();
            DataContext = this;
            _controller = controller;
            Computer = iComputer;
            _søghardware = søgHardware;

            OpdaterSide();
        }

        #endregion

        #region Methods

        private void UdlånEnhed()
        {
            if (SelectedBruger == null) return;
            var afdeling = _controller.HentBrugersAfdeling(SelectedBruger);

            var formular = new Form();
            formular.Title = String.Format("Udlån {0}", Computer.Navn);
            formular.BtnSubmit = "Udlån";

            formular.CreateDisabledTextBox("initialer", "Brugerens initialer:", SelectedBruger.Initialer);
            formular.CreateDisabledTextBox("navn", "Brugerens navn:", SelectedBruger.Navn);
            formular.CreateDisabledTextBox("afdeling", "Brugerens afdeling:", afdeling.Navn);
            formular.CreateDateBox("dato", "Udlånsdato:", DateTime.Now);

            var window = new FormWindow(formular);
            if (window.ShowDialog() == true)
            {
                DateTime dato = (DateTime)formular.Result["dato"];

                bool udlånt = _controller.UdlånComputer(SelectedBruger, (IComputer)Computer, dato);

                if (udlånt)
                {
                    OpdaterBrugereListView();
                    OpdaterAlleUdlånListView();
                    _søghardware.OpdaterSide();
                }
                else
                {
                    MessageBox.Show("Der er ikke nok ledige enheder", "Fejl", MessageBoxButton.OK,
                                    MessageBoxImage.Error);
                }
            }
        }

        public void UdskrivKontrakt()
        {
            var udlånsListe = new List<IUdlån>();
            udlånsListe.Add(SelectedUdlån);
            _controller.UdskrivKontrakt(udlånsListe);
        }

        #endregion

        #region Events

        private void ListViewAlleUdlån_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            SelectedUdlån = ListViewAlleUdlån.SelectedItem as IUdlån;

            bool result = (SelectedUdlån != null);

            BtnFjernUdlån.IsEnabled = result;
        }

        private void ListViewBrugere_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            SelectedBruger = ListViewBrugere.SelectedItem as IBruger;

            bool result = (SelectedBruger != null);

            BtnUdlånEnhed.IsEnabled = result;
        }

        private void MenuItemUdskrivKontrakt_Click(object sender, RoutedEventArgs e)
        {
            UdskrivKontrakt();
        }

        private void MenuItemSletUdlån_Click(object sender, RoutedEventArgs e)
        {
            if (SelectedUdlån == null) return;

            var result = MessageBox.Show(String.Format("Er du sikker på du vil fjerne udlånet?"), "Sikker?", MessageBoxButton.YesNo, MessageBoxImage.Question);

            if (result == MessageBoxResult.No) return;

            _controller.FjernUdlån(SelectedUdlån);

            _søghardware.OpdaterSide();
            OpdaterAlleUdlånListView();
            OpdaterBrugereListView();
        }

        private void BtnUdlånEnhed_Click(object sender, RoutedEventArgs e)
        {
            UdlånEnhed();
        }

        private void ListViewBrugere_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            UdlånEnhed();
        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Escape)
                Close();
        }

        #endregion

        #region Tilstandsstyring

        public void OpdaterBrugereListView()
        {
            ListViewBrugere.ItemsSource = null;
            ListViewBrugere.ItemsSource = _controller.HentBrugereDerIkkeHarLåntEnhed(Computer);
        }

        public void OpdaterAlleUdlånListView()
        {
            ListViewAlleUdlån.ItemsSource = null;
            ListViewAlleUdlån.ItemsSource = _controller.HentUdlånMedEnhed(Computer);
        }

        public void OpdaterSide()
        {
            OpdaterAlleUdlånListView();
            OpdaterBrugereListView();
            Title = Computer.Navn;
            LblAlleUdlånTitel.Content = String.Format("Følgende brugere har lånt {0}", Computer.Navn);
            LblNytUdlånTitel.Content = String.Format("Udlån {0} til en ny bruger", Computer.Navn);
        }

        #endregion
    }
}
